<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
	</body>
</html>
<script type="text/javascript">
	var arr = [1, 2, 3]
	// 判断数组
	// 1.isArray
	// 而且对于多全局环境，Array.isArray() 同样能准确判断，但有个问题，Array.isArray() 是在ES5中提出，也就是说在ES5之前可能会存在不支持此方法的情况
	Array.isArray(arr)

	// 2.instanceof 
	// instanceof 运算符用于检验构造函数的prototype属性是否出现在对象的原型链中的任何位置，返回一个布尔值
	// 问题：prototype属性是可以修改的，所以并不是最初判断为true就一定永远为真
	// 其次，当我们的脚本拥有多个全局环境，例如html中拥有多个iframe对象，instanceof的验证结果可能不会符合预期
	// true
	console.log(arr instanceof Array)
	// 2.1EX:
	//为body创建并添加一个iframe对象
	var iframe = document.createElement('iframe');
	document.body.appendChild(iframe);
	//取得iframe对象的构造数组方法
	xArray = window.frames[0].Array;
	//通过构造函数获取一个实例
	var arr1 = new xArray(1, 2, 3);
	console.log(arr1 instanceof Array) //false 
	// 导致这种问题是因为iframe会产生新的全局环境，它也会拥有自己的Array.prototype属性，让不同环境下的属性相同很明显是不冉全的做饭，所以Array.prototype !== window.frames[0].Array.prototype,想要arr instanceof Array 为true，你得保证arr是由原始Array构造函数创建时才可行。
	
	// 3.通过constructor 判断
	// 实例的构造函数属性constructor指向构造函数，那么通过constructor属性也可以判断是否为一个数组。
	let a = [1,3,4]
	console.log(a.constructor === Array) // true
	
	// 3.1这种判断也会存在多个全局环境的问题，导致的问题与instanceof相同
	// 为body创建并添加一个iframe标签
	var iframe1 = document.createElement('iframe');
	document.body.appendChild(iframe1)
	// 取得iframe对象的构造数组方法
	xArray1 = window.iframes[window.frames.length - 1].Array;
	var arr2 = new xArray1(1,2,3)
	console.log(arr2.constructor === Array) // false
	
	// 4.通过Object.prototype.toString.call()判断
	// 可以获取到对象的不同类型，例如
	let b= [1,3,4]
	console.log( Object.prototype.toString.call(b) ===['Object Array'])   //true
	// 4.1他的强大的地方在于不仅仅可以检验是否为数组，比如是否是一个函数，是否是数字等等
	// 检验是否是函数
	let c = function(){}
	console.log(Object.prototype.toString.call() === '[Object Function]') // true
	// 检验是否是数字
	let d = 1
	console.log(Object.prototype.toString.call() === '[Object Number]') // true
	// 对于多全局环境是，Object.prototype.toString.call()也能符合预期处理
	
	//为body创建并添加一个iframe标签
	var iframe = document.createElement('iframe');
	document.body.appendChild(iframe);
	//取得iframe对象的构造数组方法
	xArray = window.frames[window.frames.length-1].Array;
	//通过构造函数获取一个实例
	var arr = new xArray(1,2,3); 
	console.log(Object.prototype.toString.call(arr) === '[object Array]');//true
	// 5.判断数组方法的推荐
	// 当然还是用Array.isArray(),从ES5新增isArray()方法正是为了提供一个稳定可用的数组判断方法，不可能专门为此提出的好东西不用，而对于ES5之前不支持此方法的问题，我们其实可以做好兼容进行自行封装
	if(!Array.isArray){
		Array.isArray = function(arg){
			return Object.prototype.toString.call(arg) === '[Object Array]'
		}
	}
	
</script>
